package com.evan.idempotent.idempotent;

import com.evan.idempotent.request.IdempotentRequest;
import com.evan.idempotent.warpper.IdempotentRunnable;
import com.evan.idempotent.warpper.IdempotentSupplier;

import java.util.concurrent.TimeUnit;

/**
 * @Description: 幂等接口
 * @Author liudeguang
 */
public interface DistributedIdempotent {


    /**
     * 单独KEY幂等执行
     *
     * @param key              幂等Key
     * @param storgeExpireTime 存储过期时间
     * @param timeUnit         存储时间单位
     * @return
     */
    Boolean execute(String key, long storgeExpireTime, TimeUnit timeUnit);


    /**
     * 幂等执行
     *
     * @param key              幂等Key
     * @param lockExpireTime   锁的过期时间
     * @param storgeExpireTime 存储过期时间
     * @param timeUnit         存储时间单位
     * @param execute          要执行的逻辑
     * @param fail             Key已经存在，幂等拦截后的执行逻辑
     * @return
     */
    <T> T execute(String key, long lockExpireTime, long storgeExpireTime, TimeUnit timeUnit, IdempotentSupplier<T> execute, IdempotentSupplier<T> fail);


    /**
     * 幂等执行
     *
     * @param request 幂等参数
     * @param execute 要执行的逻辑
     * @param fail    Key已经存在，幂等拦截后的执行逻辑
     * @return
     */
    <T> T execute(IdempotentRequest request, IdempotentSupplier<T> execute, IdempotentSupplier<T> fail);

    /**
     * 幂等执行
     *
     * @param key              幂等Key
     * @param lockExpireTime   锁的过期时间
     * @param storgeExpireTime 存储过期时间
     * @param timeUnit         存储时间单位
     * @param execute          要执行的逻辑
     * @param fail             Key已经存在，幂等拦截后的执行逻辑
     * @return
     */
    void execute(String key, long lockExpireTime, long storgeExpireTime, TimeUnit timeUnit, IdempotentRunnable execute, IdempotentRunnable fail);

    /**
     * 幂等执行
     *
     * @param request 幂等参数
     * @param execute 要执行的逻辑
     * @param fail    Key已经存在，幂等拦截后的执行逻辑
     * @return
     */
    void execute(IdempotentRequest request, IdempotentRunnable execute, IdempotentRunnable fail);
}
